package com.ccys.db.utils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @program: WhiteCoat
 * @description: 字段校验工具类
 * @author: ZhangJingCan
 * @create: 2023-12-14 11:34
 **/

public class FieldValidatorUtil {

    /**
     * 校验对象中的字段是否为 null 或空字符串，可以指定排除的字段名称
     *
     * @param object         要校验的对象
     * @param excludeFields  排除校验的字段名称
     * @return               校验通过返回 true，否则返回 false
     */
    public static boolean validateFields(Object object, String... excludeFields) {
        // 如果传入的对象为空，直接返回 false
        if (object == null) {
            return false;
        }

        // 将排除的字段名称转化为一个 Set 集合，便于后面快速查找
        Set<String> excludeSet = new HashSet<>(Arrays.asList(excludeFields));
        Field[] fields = object.getClass().getDeclaredFields(); // 获取对象的所有字段

        for (Field field : fields) {
            if (excludeSet.contains(field.getName())) {
                // 如果当前字段名在排除名单中，则跳过这个字段的校验
                continue;
            }

            try {
                field.setAccessible(true); // 设置私有字段可访问
                Object value = field.get(object); // 获取字段的值

                // 如果字段值为空或空字符串，则返回 false
                if (value == null || (value instanceof String && ((String) value).isEmpty())) {
                    return false;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace(); // 处理异常情况，实际项目中可能需要更合适的异常处理
                return false;
            }
        }

        // 所有字段校验通过
        return true;
    }

}
